<?php

/**
 * SmartPHP framework
 *
 * @name SmartPHP framework
 * @package SmartPHP
 * @author 费尔 <admin@smartphp.cn>
 * @version 1.0 Beta
 * @link http://www.smartphp.cn
 * @copyright smartphp.cn
 * @license <a href="http://www.smartphp.cn">smartphp</a>
 */

namespace Base;

/**
 * 输入操作类
 *
 * @author 费尔 <admin@xuai.cn>
 */
class Input {

    /**
     * 获取GET
     *
     * @param string|NULL $key 名称 为空时返回所有
     * @param string $filter 安全过滤方法
     * @access public
     * @return mixed
     */
    public static function get($key = null, $filter = NULL) {
        if (is_null($key))
            return self::varFilter($_GET, $filter);
        elseif (isset($_GET[$key]) && filter_has_var(INPUT_GET, $key))
            return self::varFilter($_GET[$key], $filter);
        return NULL;
    }

    /**
     * 获取POST
     *
     * @param string|NULL $key 名称 为空时返回所有
     * @param string $filter 安全过滤方法
     * @access public
     * @return mixed
     */
    public static function post($key = null, $filter = NULL) {
        if (is_null($key))
            return self::varFilter($_POST, $filter);
        elseif (isset($_POST[$key]) && filter_has_var(INPUT_POST, $key))
            return self::varFilter($_POST[$key], $filter);
        return NULL;
    }

    /**
     * 获取POST
     *
     * @param string|NULL $key 名称 为空时返回所有
     * @param string $filter 安全过滤方法
     * @access public
     * @return mixed
     */
    public static function put($key = null, $filter = NULL) {
        static $_put = null;
        if (is_null($_put)) {
            parse_str(file_get_contents('php://input'), $_put);
        }
        return $_put;
    }

    /**
     * 获取POST
     *
     * @param string|NULL $key 名称 为空时返回所有
     * @param string $filter 安全过滤方法
     * @access public
     * @return mixed
     */
    public static function delete($key = null, $filter = NULL) {
        static $_delete = null;
        if (is_null($_delete)) {
            parse_str(file_get_contents('php://input'), $_delete);
            $_delete = array_merge($_delete, $_GET);
        }
        return $_delete;
    }

    /**
     * 获取COOKIE
     *
     * @param string|NULL $key 名称 为空时返回所有
     * @param string $filter 安全过滤方法
     * @access public
     * @return mixed
     */
    public static function cookie($key = null, $filter = NULL) {
        if (is_null($key))
            return self::varFilter($_COOKIE, $filter);
        elseif (isset($_COOKIE[$key]) && filter_has_var(INPUT_COOKIE, $key))
            return self::varFilter($_COOKIE[$key], $filter);
        return NULL;
    }

    /**
     * 获取SERVER
     *
     * @param string|NULL $key 名称 为空时返回所有
     * @param string $filter 安全过滤方法
     * @access public
     * @return mixed
     */
    public static function server($key = null, $filter = NULL) {
        if (is_null($key))
            return self::varFilter($_SERVER, $filter);
        elseif (isset($_SERVER[$key]) && filter_has_var(INPUT_SERVER, $key))
            return self::varFilter($_SERVER[$key], $filter);
        return NULL;
    }

    /**
     * 获取ENV
     *
     * @param string|NULL $key 名称 为空时返回所有
     * @param string $filter 安全过滤方法
     * @access public
     * @return mixed
     */
    public static function env($key = null, $filter = NULL) {
        if (is_null($key))
            return self::varFilter($_ENV, $filter);
        elseif (isset($_ENV[$key]) && filter_has_var(INPUT_ENV, $key))
            return self::varFilter($_ENV[$key], $filter);
        return NULL;
    }

    /**
     * 参数过滤方法
     *
     * @param string|array $content 过滤内容
     * @param string $filter 过滤方法
     * @access public
     * @return mixed
     */
    public static function varFilter($content, $filter = NULL) {
        static $_filter = NULL;
        if (empty($_filter))
            $_filter = $filter ?: Config::get('filter');
        return is_array($content) ? array_map(function ($content) {
                    return self::varFilter($content);
                }, $content) : trim($_filter($content));
    }

    /**
     * 当前请求的参数
     * @access public
     * @param string $name 变量名
     * @param mixed $default 默认值
     * @return mixed
     */
    public static function param($name = '', $default = null) {
        static $param = NULL;
        if (empty($param)) {
            switch (Request::method()) {
                case 'POST':
                    $vars = self::post();
                    break;
                case 'PUT':
                    $vars = self::put();
                    break;
                case 'DELETE':
                    $vars = self::delete();
                    break;
                default:
                    $vars = [];
            }
            $param = array_merge(self::get(), $vars);
        }
        if ($name) {
            return $param[$name] ?? $default;
        } else {
            return $param;
        }
    }

}
